package javaDemo.demo.day_04_03_JUCAssistClass;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * @Description
 * @Author
 * @Date 2020/11/1 15:49
 * @Version 1.0
 */
public class CyclicBarrierDemo {

    /**
     *【CyclicBarrier 初步理解】
     * 1、是 CountDownLatch 的反向版本；
     * 2、实例化 CyclicBarrier 时，传递一个 parties 参数，和一个 线程实现；
     * 3、目前的理解是：调用一次 cyclicBarrier.await() ，内部计数器就加一（内部计数器初始值为 0），并且阻塞当前线程
     * 4、当内部计数器达到 parties 后，实例化传递的线程执行；
     * 5、实例化传递的线程执行完毕后，之前 await() 的线程全部被唤醒，重新按顺序进行执行；
     * @param args
     */
    public static void main(String[] args) {

        CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> { System.out.println("*****召唤神龙！*****"); });

        for (int i = 1; i <= 7 ; i++) {
            final int index = i;
            new Thread(() -> {
                System.out.println("当前集齐到第" + index + "个龙珠");
                try {
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println("=======当前集齐到第" + index + "个龙珠");
            },i + "").start();
        }

    }
}
